class Solution {
public:
    int minOperations(vector<int>& nums, int x) {
        // 正难则反，本题需要灵活转化
        // 题目中是说每一次操作时，你应当移除数组 nums 最左边或最右边的元素，使x减去这个元素恰好等于0
        // 然后返回最小操作次数，也就是左边最少选几个数，右边最少选几个数，满足使x减去这些元素恰好等于0
        // 转化为求中间这段连续的数组中最长的恰好等于   整个数组之和 减去 x   的元素个数len
        // 此时答案就是nums.size() - len
        // 转化为这样就只需要考虑一段连续区间，不需要左右都兼顾
        int sum = 0;
        // 求出整个数组所有元素之和
        for(auto &e : nums) sum += e;

        // 如果数组所有元素之和都小于x，那就提前return了，表明没有数可以把x减到0
        if(sum < x) return -1;

        int target = sum - x, left = 0, max_len = INT_MIN, n = nums.size(), amount = 0;
        for(int i = 0; i < n; i++)
        {
            amount += nums[i];  // 入窗口
            while(amount > target)  // 判断
                amount -= nums[left++]; // 出窗口
            if(amount == target)    // 更新结果
                max_len = max(max_len, i - left + 1);
        }
        return max_len == INT_MIN ? -1 : n - max_len;
    }
};